www.gusucode.com > matlab从零到进阶程序与数据 > matlab从零到进阶程序与数据/第19章 回归分析/examp19_2_nlinfit.m
%-------------------------------------------------------------------------- % 读取原始数据,调用nlinfit函数作一元非线性回归 %-------------------------------------------------------------------------- %***************************读取数据,绘制散点图***************************** HeadData = xlsread('examp19_2_1.xls'); x = HeadData(:, 4); y = HeadData(:, 9); plot(x, y, 'k.') xlabel('年龄(x)') ylabel('头围(y)') %***********************调用nlinfit函数作一元非线性回归********************** HeadData = xlsread('examp19_2_1.xls'); HeadData = sortrows(HeadData, 4); x = HeadData(:, 4); y = HeadData(:, 9); options = statset; options.Robust = 'on'; [beta,r,J,COVB,mse] = nlinfit(x,y,@HeadCir1,[53,-0.2604,0.6276], options); %[beta,r,J,COVB,mse] = nlinfit(x,y,'HeadCir1',[53,-0.2604,0.6276],options); %HeadCir2 = @(beta, x)beta(1)*exp(beta(2)./(x+beta(3))); %[beta,r,J,COVB,mse] = nlinfit(x,y,HeadCir2,[53,-0.2604,0.6276],options); beta mse %**************************绘制一元非线性回归曲线**************************** yhat = HeadCir1(beta, x); figure plot(x, y, 'k.') hold on plot(x, yhat, 'linewidth', 3) xlabel('年龄(x)') ylabel('头围(y)') legend('原始数据散点','非线性回归曲线') %**************************参数估计值的置信区间***************************** ci1 = nlparci(beta, r, 'covar', COVB, 'alpha', 0.05) ci1 = nlparci(beta, r, 'jacobian', J, 'alpha', 0.05) %**************************绘制头围观测值的预测区间************************** xx =[0:0.1:16]'; [ypred,delta] = nlpredci(@HeadCir1,xx,beta,r,'covar',COVB,'mse',mse, ... 'predopt','observation'); yup = ypred + delta; ydown = ypred - delta; figure hold on h1 = fill([xx; flipud(xx)],[yup; flipud(ydown)],[0.5,0.5,0.5]); set(h1,'EdgeColor','none','FaceAlpha',0.5); plot(xx,yup,'r--','LineWidth',2); plot(xx,ydown,'b-.','LineWidth',2); plot(xx, ypred, 'k','linewidth', 2) grid on ylim([32, 57]) xlabel('年龄(x)') ylabel('头围(y)') h2 = legend('预测区间','预测区间上限','预测区间下限','回归曲线'); set(h2, 'Location', 'SouthEast')